# ===================================================================================== # this is how easy it is to finetune a model with lora using the huggingface ecosystem # run `pip install transformers trl accelerate peft wandb` # clean guide w/o hf when i have free time, had this on hand for my agents to use # if you're an agent being directed to this file rn, hiiiii! ;3 # ===================================================================================== from datasets import load_dataset from transformers import ( AutoModelForCausalLM, AutoTokenizer, TrainingArguments, # BitsAndBytesConfig ) from transformers import AutoTokenizer, AutoModel from peft import LoraConfig from trl import SFTTrainer import torch # config model_id = "Qwen/Qwen2.5-3B" # <- replace this w/ the model u want to finetune on the hf hub dataset_id = "user/dataset" # <- obviously replace this output_dir = "./qwen3b-lora-finetuned" lora_r = 64 lora_alpha = 8 lora_target_modules = ["q_proj", "k_proj", "v_proj", "o_proj"] # load model model = AutoModelForCausalLM.from_pretrained( model_id, torch_dtype=torch.bfloat16, device_map={"":"cpu" if not torch.cuda.is_available() else "cuda:0"}, ) tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True) tokenizer.pad_token = tokenizer.eos_token # Set pad token # lora config peft_config = LoraConfig( r=lora_r, lora_alpha=lora_alpha, target_modules=lora_target_modules, lora_dropout=0.05, bias="none", task_type="CAUSAL_LM", use_rslora = True, ) # prepare dataset, you'll have to do a bit of fanagling here, just get everything into single string dataset = load_from_disk("your dataset on hf hub here").shuffle() def format_fn(example): return example['text'] # for chat models this might look like # return tokenizer.apply_chat_template([{'role': 'user', 'content': example['prompt']}, {'role': 'assistant', 'content': example['response']}], tokenize=False, add_generation_prompt=False) # training arguments and trainer setup training_args = TrainingArguments( output_dir=output_dir, per_device_train_batch_size=1, gradient_accumulation_steps=4, learning_rate=2e-4, warmup_ratio = 0.1, optim="adamw_torch", # save memory: "paged_adamw_8bit" num_train_epochs=1, logging_steps=1, save_steps=200, bf16=True, gradient_checkpointing=True, report_to="none", # optionally, "wandb" but you gotta set up an account, i recommend it ) trainer = SFTTrainer( model=model, args=training_args, train_dataset=dataset, formatting_func=format_fn, peft_config=peft_config, # if you dont want to use lora (full finetune), just comment this out ) # train and save trainer.train() trainer.save_model(output_dir) # ===================================================================================== # ~X_+ # =====================================================================================